package cn.com.dashihui.api.radisysnc.thread;

import java.util.Map;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.Callable;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import cn.com.dashihui.api.radisysnc.inter.IRequest;
import cn.com.dashihui.api.radisysnc.request.InventoryUpdateDBRequest;
import cn.com.dashihui.api.radisysnc.request.RequestQueue;

/**
 * ***********************************************
　 * <p>类名: RequestProcessorThread</p> 
　 * <p>描述: 请求处理线程</p> 
　 * @author niufc 
　 * @date 2019年8月19日 
  * ************************************************
 */
public class RequestProcessorThread implements Callable<Boolean>{
	protected Logger logger = LoggerFactory.getLogger(getClass());
	private ArrayBlockingQueue<IRequest> queue;
    public RequestProcessorThread(ArrayBlockingQueue<IRequest> queue){
        this.queue = queue;
    }
    @Override
    public Boolean call() throws Exception {
       IRequest request = queue.take();
       Map<Object, Boolean> flagMap = RequestQueue.getInstance().getFlagMap();
       System.out.println("异步线程>>>>>>>>>>>0"+request.isForceFefresh());
       //不需要强制刷新的时候，查询请求去重处理
           if (!request.isForceFefresh()){
               if (request instanceof InventoryUpdateDBRequest) {//如果是更新请求，那就置为false
                   flagMap.put(request.getGoodsId(), true);
               } else {
            	   if(request.getOrderNum()==null){
            		   Boolean flag = flagMap.get(request.getGoodsId());
                       System.out.println("异步线程>>>>>>>>>>>0"+flag);
                       /**
                        * 标志位为空，有三种情况
                        * 1、没有过更新请求
                        * 2、没有查询请求
                        * 3、数据库中根本没有数据
                        * 在最初情况，一旦库存了插入了数据，那就好会在缓存中也会放一份数据，
                        * 但这种情况下有可能由于redis中内存满了，redis通过LRU算法把这个商品给清除了，导致缓存中没有数据
                        * 所以当标志位为空的时候，需要从数据库重查询一次，并且把标志位置为false，以便后面的请求能够从缓存中取
                        */
                       if ( flag == null) {
                           flagMap.put(request.getGoodsId(), false);
                       }
                       /**
                        * 如果不为空，并且flag为true，说明之前有一次更新请求，说明缓存中没有数据了（更新缓存会先删除缓存），
                        * 这个时候就要去刷新缓存，即从数据库中查询一次，并把标志位设置为false
                        */
                       if ( flag != null && flag) {
                           flagMap.put(request.getGoodsId(), false);
                       }
                       /**
                        * 这种情况说明之前有一个查询请求，并且把数据刷新到了缓存中，所以这时候就不用去刷新缓存了，直接返回就可以了
                        */
                       if (flag != null && !flag) {
                           flagMap.put(request.getGoodsId(), false);
                           return true;
                       } 
            	   }else{
            		   Boolean flag = flagMap.get(request.getOrderNum());
                       System.out.println("异步线程>>>>>>>>>>>0"+flag);
                       /**
                        * 标志位为空，有三种情况
                        * 1、没有过更新请求
                        * 2、没有查询请求
                        * 3、数据库中根本没有数据
                        * 在最初情况，一旦库存了插入了数据，那就好会在缓存中也会放一份数据，
                        * 但这种情况下有可能由于redis中内存满了，redis通过LRU算法把这个商品给清除了，导致缓存中没有数据
                        * 所以当标志位为空的时候，需要从数据库重查询一次，并且把标志位置为false，以便后面的请求能够从缓存中取
                        */
                       if ( flag == null) {
                           flagMap.put(request.getOrderNum(), false);
                       }
                       /**
                        * 如果不为空，并且flag为true，说明之前有一次更新请求，说明缓存中没有数据了（更新缓存会先删除缓存），
                        * 这个时候就要去刷新缓存，即从数据库中查询一次，并把标志位设置为false
                        */
                       if ( flag != null && flag) {
                           flagMap.put(request.getOrderNum(), false);
                       }
                       /**
                        * 这种情况说明之前有一个查询请求，并且把数据刷新到了缓存中，所以这时候就不用去刷新缓存了，直接返回就可以了
                        */
                       if (flag != null && !flag) {
                           flagMap.put(request.getOrderNum(), false);
                           return true;
                       } 
            	   }
               }
           }
           System.out.println("异步线程数据库查询>>>>>>>>>>>>>>>>>>"+request);
           System.out.println("异步线程数据库查询>>>>>>>>>>>>>>>>>>"+request.getOrderNum());
           System.out.println("异步线程数据库查询>>>>>>>>>>>>>>>>>>"+request.getGoodsId());
           if(request.getOrderNum()!=null){
        	   request.processOrderG();
           }else{
        	   request.process();
           }
        return true;
    }

 

}
